package com.info.zhiduoduo.admin.schedule;

import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.info.zhiduoduo.admin.service.*;
import com.info.zhiduoduo.common.annotation.ZddTask;
import com.info.zhiduoduo.common.utils.ContextUtil;
import com.info.zhiduoduo.common.utils.DateUtil;
import com.info.zhiduoduo.core.service.*;
import com.info.zhiduoduo.core.service.impl.CeoNoticeService;
import com.info.zhiduoduo.core.service.payment.thirdpay.ZhaoShangTradeBulterService;
import com.info.zhiduoduo.repository.entity.company.CompanyProject;
import com.info.zhiduoduo.repository.entity.crowdsource.CrowdsourceInvoice;
import com.info.zhiduoduo.repository.entity.crowdsource.CrowdsourceProject;
import com.info.zhiduoduo.repository.entity.crowdsource.CrowdsourceTradeRecordItem;
import com.info.zhiduoduo.repository.entity.order.TradeRecord;
import com.info.zhiduoduo.repository.entity.system.SystemScheduleTask;
import com.info.zhiduoduo.repository.mapper.company.CompanyEntrustFileMapper;
import com.info.zhiduoduo.repository.mapper.crowdsource.CrowdsourceProjectMapper;
import com.info.zhiduoduo.repository.mapper.crowdsource.CrowdsourceTradeRecordItemMapper;
import com.info.zhiduoduo.repository.mapper.crowdsource.CrowdsourceTradeRecordMapper;
import com.info.zhiduoduo.repository.mapper.foreign.ForeignInvoiceMapper;
import com.info.zhiduoduo.repository.mapper.invoice.InvoiceMapper;
import com.info.zhiduoduo.repository.mapper.order.OrderProductMapper;
import com.info.zhiduoduo.repository.mapper.order.TradeRecordMapper;
import com.info.zhiduoduo.repository.mapper.partner.PartnerWithdrawMapper;
import com.info.zhiduoduo.repository.mapper.system.SystemScheduleTaskMapper;

import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.annotation.AnnotationUtils;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;

import java.lang.reflect.Method;
import java.util.Date;
import java.util.List;
import java.util.Map;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;

import lombok.extern.slf4j.Slf4j;

/**
 * 配合{@code @ZddTask}注解 和 {@code ZddTaskAspect}切片 完成定时任务的执行记录。并且在{@code ZddTaskAspect}里面判断每个定时任务是否可以执行或已经关闭。
 * <p> 在每次启动应用时，本类中所有的被@ZddTask标记的定时任务方法都会自动在init()方法中同步到数据库，所以不需要手动修改数据库中的数据。
 * <p> 每个定时任务方法都应该定义为{@code return String}，将执行结果返回给{@code ZddTaskAspect} 然后记录到数据库中。
 *
 * @see ZddTask
 * @see com.info.zhiduoduo.admin.interceptor.ZddTaskAspect
 */
@Slf4j
@Component
public class AdminScheduleJob {

	@Autowired
	ProjectService projectService;
	@Autowired
	PartnerService partnerService;
	@Autowired
	CeoNoticeService ceoNoticeService;
	@Autowired
	CoreProjectService coreProjectService;
	@Autowired
	AccountService accountService;
	@Autowired
	ZhiduoduoProjectService zhiduoduoProjectService;
	@Autowired
	CoreCompanyService coreCompanyService;
	@Autowired
	ReportService reportService;
	@Autowired
	MakerService makerService;
	@Autowired
	CrowdsourceProjectService crowdsourceProjectService;
	@Autowired
	CrowdsourceService crowdsourceService;
	@Autowired
	CrowdsourceDepositService crowdsourceDepositService;
	@Autowired
	PartnerCrowdsourceCostService partnerCrowdsourceCostService;
	@Autowired
	MakerAliPayService makerAliPayService;
	@Autowired
	CoreLongTermProjectService coreLongTermProjectService;
	@Autowired
	InvoiceService invoiceService;
	@Resource
	BalanceService balanceService;
	@Autowired
	CompanyService companyService;
	@Resource
	CompanyEntrustFileMapper companyEntrustFileMapper;
	@Autowired
	EntrustProjectService entrustProjectService;
	@Autowired
	ZhaoShangTradeBulterService zhaoShangTradeBulterService;

	@Resource
	TradeRecordMapper tradeRecordMapper;
	@Resource
	InvoiceMapper invoiceMapper;
	@Resource
	CrowdsourceTradeRecordMapper crowdsourceTradeRecordMapper;
	@Resource
	CrowdsourceTradeRecordItemMapper crowdsourceTradeRecordItemMapper;
	@Resource
	PartnerWithdrawMapper partnerWithdrawMapper;
	@Resource
	CrowdsourceProjectMapper crowdsourceProjectMapper;
	@Resource
	SystemScheduleTaskMapper systemScheduleTaskMapper;
	@Resource
	OrderProductMapper orderProductMapper;
	@Autowired
	WxMessageService wxMessageService;
	@Value("${schedule.enabled}")
	private boolean enabled;

	/**
	 * 初始化，将本类中的所有定时任务同步到数据库。如果数据库中不存在，则新建一条定时任务数据，如果已存在，则更新描述。
	 * <p> 以定时任务名称为唯一索引，新建定时任务时，保证名称唯一性。
	 * <p> 如果修改了任务名称，使用{@code ZddTask}注解的{@code oldName}属性指明旧名称，用{@code taskName}指明新名称，在重启应用时会自动更新名称。或者，
	 * 在重启应用前，先修改数据库中的记录名称，否则老名称的记录会被删除。
	 */
	@PostConstruct
	public void init() {
		// 获取定义的所有定时任务
		Map<String, SystemScheduleTask> taskMap = Maps.newHashMap();
		Method[] methods = this.getClass().getMethods();
		for (Method method : methods) {
			ZddTask zddTask = AnnotationUtils.getAnnotation(method, ZddTask.class);
			Scheduled scheduled = AnnotationUtils.getAnnotation(method, Scheduled.class);
			if (zddTask != null) {
				String taskName = zddTask.name();
				if (StringUtils.isEmpty(taskName)) {
					throw new RuntimeException("AdminScheduleJob 定时任务名称不能设置为空字符串。");
				}
				if (!taskMap.containsKey(taskName)) {
					taskMap.put(taskName, SystemScheduleTask.of(zddTask, scheduled));
				} else {
					throw new RuntimeException("AdminScheduleJob 定义了相同的定时任务名称，需要保证定时任务名称唯一：" + taskName);
				}
			}
		}

		// 同步数据到数据库
		List<String> remainedNames = Lists.newArrayList();
		List<SystemScheduleTask> newList = Lists.newArrayList();
		Map<String, SystemScheduleTask> existsMap = Maps.newHashMap();
		List<SystemScheduleTask> existsList = systemScheduleTaskMapper.listAll();
		for (SystemScheduleTask existsTask : existsList) {
			existsMap.put(existsTask.getTaskName(), existsTask);
		}
		for (SystemScheduleTask task : taskMap.values()) {
			// 1.先找出已经存在于数据库的任务
			String oldName = task.getOldName();
			SystemScheduleTask existsTask = null;
			// 直接通过任务名称查找
			if ((existsTask = existsMap.get(task.getTaskName())) == null) {
				// 如果oldName不为空，找oldName是否能匹配到已存在的记录，如果存在就更新为新的名称
				existsTask = existsMap.get(oldName);
			}

			if (existsTask != null) {
				// 存在相同的任务，说明这个任务是要保留的，添加到remainedNames中
				remainedNames.add(existsTask.getTaskName());
				// 将名称，描述信息直接替换成最新的
				existsTask.merge(task);
			} else {
				// 2.不存在直接添加为新的
				newList.add(task);
			}
		}
		// 3.插入新数据
		newList.forEach(SystemScheduleTask::insertOrUpdate);

		// 4.更新数据并将已经不需要的定时任务删掉
		for (String remainedName : remainedNames) {
			SystemScheduleTask task = existsMap.remove(remainedName);
			if (task != null) task.updateById();
		}
		if (!CollectionUtils.isEmpty(existsMap)) {
			existsMap.values().forEach(SystemScheduleTask::deleteById);
		}
	}

//	@ZddTask(name = " 项目支付结果", desc = "查询支付结果，并修改 项目状态", cronDesc = "每分钟一次")
//	@Scheduled(cron = "0 0/1 * * * ?")
//	public String checkTradeState() {
//		StringBuilder sb = new StringBuilder();
//		tradeRecordMapper.getInProcessTradeids().forEach(tradeid -> {
//			try {
//				TradeRecord trade = new TradeRecord().selectById(tradeid);
//				CompanyProject project = new CompanyProject().selectById(trade.getProjectid());
//				if (project == null) return;
//				int prevState = project.getState();
//
//				projectService.queryTradeState(tradeid);
//
//				// 修改后
//				project = new CompanyProject().selectById(trade.getProjectid());
//				int currState = project.getState();
//
//				if (prevState != currState) {
//					sb.append(String.format("项目id：%d，由状态%d 修改为%d", project.getProjectid(), prevState, currState));
//					sb.append("\n");
//				}
//			} catch (Exception e) {
//				log.error("", e);
//			}
//		});
//
//		return sb.toString();
//	}
//
//	@ZddTask(name = " 项目线下微信支付结果", desc = "查询 项目线下微信支付结果，并修改 项目状态", cronDesc = "每分钟一次")
//	@Scheduled(cron = "0 0/1 * * * ?")
//	public String checkProjectOfflinePayState() {
//		StringBuilder sb = new StringBuilder();
//		invoiceMapper.getOfflinePaidList().forEach(invoice -> {
//			try {
//				CompanyProject project = new CompanyProject().selectById(invoice.getProjectid());
//				if (project == null) return;
//				int prevState = project.getState();
//
//				zhiduoduoProjectService.handleOfflineProjectPaidFinish(invoice);
//
//				// 修改后
//				project = new CompanyProject().selectById(invoice.getProjectid());
//				int currState = project.getState();
//
//				if (prevState != currState) {
//					sb.append(String.format("项目id：%d，由状态%d 修改为%d", project.getProjectid(), prevState, currState));
//					sb.append("\n");
//				}
//			} catch (Exception e) {
//				log.error("", e);
//			}
//		});
//		return sb.toString();
//	}
//
//	@ZddTask(name = "合伙人线上提现结果", desc = "查询所有合伙人的线上提现支付结果，修改提现状态", cronDesc = "每分钟一次")
//	@Scheduled(cron = "0 0/1 * * * ?")
//	public String checkWithdrawState() {
//		StringBuilder sb = new StringBuilder();
//		partnerWithdrawMapper.getInProcessWithdraws().forEach(withdraw -> {
//			try {
//				int prevState = withdraw.getState();
//				partnerService.queryWithdrawState(withdraw);
//
//				withdraw = withdraw.selectById();
//				int currState = withdraw.getState();
//
//				if (prevState != currState) {
//					sb.append(String.format("合伙人提现id：%d，由状态%d 修改为%d", withdraw.getWdid(), prevState, currState));
//					sb.append("\n");
//				}
//			} catch (Exception e) {
//				log.error("", e);
//			}
//		});
//		return sb.toString();
//	}
//
//	/**
//	 * 智众包批量代付单笔重新支付结果查询
//	 */
//	@ZddTask(name = "智众包批量代付单笔重新支付结果查询", desc = "查询智众包项目单笔支付失败后的重新支付结果查询, 并修改智众包项目状态", cronDesc = "每2分钟一次")
//	@Scheduled(cron = "0 0/2 * * * ?")
//	public void checkCrowdousrceTradeItemRepayState() {
//		StringBuilder sb = new StringBuilder();
//		crowdsourceTradeRecordItemMapper.getRepayingItemIds().forEach(tradeRecordItemId -> {
//			try {
//				CrowdsourceTradeRecordItem tradeItem = new CrowdsourceTradeRecordItem().selectById(tradeRecordItemId);
//				if (tradeItem == null) return;
//				Integer projectId = tradeItem.getProjectid();
//				CrowdsourceProject crowdsourceProject = new CrowdsourceProject().selectById(projectId);
//				int prevState = tradeItem.getStatus();
//				int prevProjectState = crowdsourceProject.getState();
//
//				projectService.checkCrowdousrceTradeItemRepayState(tradeRecordItemId);
//
//				tradeItem = tradeItem.selectById();
//				crowdsourceProject = crowdsourceProject.selectById();
//				int currState = tradeItem.getStatus();
//				int currProjectState = crowdsourceProject.getState();
//
//				if (prevState != currState) {
//					sb.append(String.format("众包子项目支付记录id：%d，由状态%d 修改为%d", tradeRecordItemId, prevState, currState));
//					if (prevProjectState != currProjectState) {
//						sb.append(String.format("；众包项目id：%d，由状态%d 修改为%d", projectId, prevProjectState, currProjectState));
//					}
//					sb.append("\n");
//				}
//			} catch (Exception e) {
//				log.error("", e);
//			}
//		});
//	}
//
//
//	/**
//	 * 产品微信支付成功通知
//	 */
//	@ZddTask(name = "产品微信支付成功通知", desc = "产品微信支付成功通知", cronDesc = "每2分钟一次")
//	@Scheduled(cron = "0 0/2 * * * ?")
//	public void checkOrderProductState() {
//		orderProductMapper.listOrderFroNotice().forEach(orderProduct -> {
//			try {
//				wxMessageService.notifyCompanyZhixiaoduo(orderProduct.getOrderid());
//				orderProduct.setNoticeFlag("1");
//				orderProduct.updateById();
//			} catch (Exception e) {
//				log.error("", e);
//			}
//		});
//	}
//
//	/**
//	 * 智众包批量代付查询结果
//	 */
//	@ZddTask(name = "智众包项目批量代付查询结果", oldName = "智众包项目开联通批量代付查询结果", desc = "智众包项目查询批量代付结果，并更新智众包项目状态", cronDesc = "每5分钟一次")
//	@Scheduled(cron = "0 0/5 * * * ?")
//	public void checkCrowdsourceBatchTradeState() {
//		crowdsourceTradeRecordMapper.getInProcessTradeids().forEach(batchId -> {
//			try {
//				projectService.checkCrowdsourceBatchTradeState(batchId);
//			} catch (Exception e) {
//				log.error("", e);
//			}
//		});
//
//	}
//
//	/**
//	 * 合伙人每月的绩效通知，每天早上6点执行然后发送
//	 */
//	@ZddTask(name = "合伙人每月的绩效通知", desc = "检查合伙人绩效，发送通知给对应合伙人", cronDesc = "每天早上6点执行")
//	@Scheduled(cron = "0 0 6 * * ?")
//	public void partnerPerformanceNotice() {
//		partnerService.performanceNotice();
//	}
//
//	/**
//	 * ceo通知，每天早上9点检测
//	 */
//	@ZddTask(name = "CEO通知", desc = "统计重点检测数据，发送通知给CEO", cronDesc = "每天早上9点执行")
//	@Scheduled(cron = "0 0 9 * * ?")
//	public void checkCEONotice() {
//		ceoNoticeService.checkCeoNotice();
//	}
//
//	@ZddTask(name = "计算季度业务利润", desc = "从2019年开始计算，统计每个季度的利润", cronDesc = "每天早上6点执行")
//	@Scheduled(cron = "0 0 6 * * ?")
//	public void calcQuarterBusinessGross() {
//		accountService.calcQuarterBusinessGrossJob();
//	}
//
	@ZddTask(name = "计算月度业务利润", desc = "从2019年开始计算，统计每个月度的利润", cronDesc = "每天早上6点执行")
	@Scheduled(cron = "0 0 6 * * ?")
	public void calcMonthBusinessGross() {
		accountService.calcMonthBusinessGrossJob(null, null);
	}

//	/**
//	 * 每天凌晨检查企业线下充值是否完成
//	 */
//	@ZddTask(name = "检查企业线下充值是否完成", desc = "将转帐中的企业线下充值状态修改为已转账", cronDesc = "每天凌晨执行")
//	@Scheduled(cron = "0 5 0 * * ?")
//	public void checkOfflineRechargeOrder() {
//		accountService.checkOfflineRechargeOrder();
//	}
//
//	/**
//	 * 每月1日检查合伙人kpi,发消息通知合伙人
//	 */
//	@ZddTask(name = "统计上月合伙人KPI", desc = "统计上个月合伙人KPI并发消息通知合伙人", cronDesc = "每月1日早上9点执行")
//	@Scheduled(cron = "0 0 9 1 * ?")
//	public void checkPartnerKpiPerformance() {
//		partnerService.checkPartnerKpiPerformance();
//	}
//
//	/**
//	 * 每月初检查
//	 * 1、企业客户自然月0交易预警发给商务（三个月0交易的预警给胡刚）
//	 * 2、创客（11个月交易额低于10万元的预警给胡刚，3个月0交易的预警给赵菲）
//	 */
//	/*@Scheduled(cron = "0 0 9 1 * ?")
//	public void companyAndMakerTradeNotice() {
//		log.info("检查企业和创客每月交易数量,通知商务经理和胡刚----------");
//		ceoNoticeService.companyAndMakerTradeNotice();
//	}*/
//
////	/**
////	 * 刷新绑定了开联通商户号的企业的账户余额
////	 */
////	@ZddTask(name = "刷新绑定了开联通商户号的企业的账户余额", desc = "刷新绑定了开联通商户号的企业的账户余额", cronDesc = "每5分钟执行")
////	@Scheduled(cron = "0 0/5 * * * ?")
////	public void refreashCompanyMerchantAccountInfo() {
////		coreCompanyService.refreashCompanyMerchantAccountInfo();
////	}
//
//	/**
//	 * 每日凌晨更新前一天的客服日报数据
//	 */
//	@ZddTask(name = "更新前一天的客服日报数据", desc = "更新前一天的客服日报数据", cronDesc = "每日凌晨执行")
//	@Scheduled(cron = "1 0 0 * * ?")
//	public void collectCustomerServiceReportData() {
//		reportService.collectReportStatistic(null);
//	}
//
//	/**
//	 * 每日检查即将1个星期到期的合伙人，通知胡刚和商务经理
//	 */
//	@ZddTask(name = "检查即将1个星期内到期的合伙人", desc = "每日检查即将1个星期到期的合伙人，通知胡刚和商务经理", cronDesc = "每日早上9点执行")
//	@Scheduled(cron = "0 0 9 * * ?")
//	public void checkPartnerExpireInOneWeek() {
//		ceoNoticeService.checkPartnerExpireInOneWeek();
//	}
//
//	/**
//	 * 每天检查昨日已经到期的合伙人,处理自动解约逻辑
//	 */
//	@ZddTask(name = "检查昨日已经到期的合伙人", desc = "每天检查昨日已经到期的合伙人,处理自动解约逻辑", cronDesc = "每日凌晨执行")
//	@Scheduled(cron = "1 0 0 * * ?")
//	public void checkAndHandlePartnerExpired() {
//		partnerService.checkAndHandlePartnerExpired();
//	}
//
//	/**
//	 * 每日检查即将1个星期到期的合伙人佣金比例，通知胡刚和商务经理
//	 */
//	@ZddTask(name = "检查即将1个星期到期的合伙人佣金比例", desc = "每日检查即将1个星期到期的合伙人佣金比例，通知胡刚和商务经理", cronDesc = "每日早上9点执行")
//	@Scheduled(cron = "0 0 9 * * ?")
//	public void checkPartnerCompanyExpireInOneWeek() {
//		ceoNoticeService.checkPartnerCompanyExpireInOneWeek();
//	}
//
//	/**
//	 * 每天检查合伙人自提模式的 每月佣金是否超过8000
//	 */
//	@ZddTask(name = "检查合伙人自提模式的每月佣金是否超过8000", desc = "每天检查合伙人自提模式的 每月佣金是否超过8000，并发企业微信通知胡刚", cronDesc = "每日早上9点执行")
//	@Scheduled(cron = "0 0 9 * * ?")
//	public void checkPartnerBrokerageMonthExceed() {
//		partnerService.checkPartnerBrokerageMonthExceed();
//	}
//
//	/**
//	 * 每天的8点 10点 12点 14点 16点 18点 查看共青城创客注册的政府审核状态
//	 */
//	@ZddTask(name = "查看共青城创客注册的政府审核状态", desc = "每天的8点 10点 12点 14点 16点 18点 查看共青城创客注册的政府审核状态", cronDesc = "每天的8点 10点 12点 14点 16点 18点")
//	@Scheduled(cron = "0 0 8,10,12,14,16,18 * * ?")
//	public void checkGovernmnetAuditState() {
//		makerService.checkGovernmnetAuditState();
//	}
//
//	@ZddTask(name = "匹配众包撮合项目", desc = "在未配对的众包撮合项目中进行匹配，记录匹配信息", cronDesc = "每6分钟执行一次")
//	@Scheduled(cron = "0 0/6 * * * ?")
//	public void matchCrowdsourceProject() {
//		crowdsourceProjectService.matchCrowdsourceProject();
//	}
//
//	/**
//	 * 在第三方支付公司余额低于100万发消息预警
//	 * 30 分钟发一次推送给 纪锦娟
//	 */
//	@ZddTask(name = "第三方支付公司余额低于100万发消息预警通知纪锦娟", desc = "检测在第三方支付公司余额低于100万发消息预警，周末不执行，30 分钟发一次推送给 纪锦娟", cronDesc = "每30分钟执行一次")
//	@Scheduled(cron = "0 0/30 * * * ?")
//	//@Scheduled(cron = "0 0/30 7-20 * * ?")
//	public void balanceInsufficientNotice() {
//		if (DateUtil.isWeekend(new Date())) return;
//		balanceService.queryBalanceAndNotice(1);
//	}
//
//	/**
//	 * 在第三方支付公司余额低于100万发消息预警（微信消息改版，取消通知）
//	 * 每晚点8点推送给 胡刚和测试
//	 */
////	@ZddTask(name = "在第三方支付公司余额低于100万发消息预警通知胡刚", desc = "检测在第三方支付公司余额低于100万发消息预警，周末不执行，30 分钟发一次推送给 胡刚和测试", cronDesc = "每天晚上8点执行")
////	@Scheduled(cron = "0 0 20 * * ?")
////	public void balanceInsufficientNotice2() {
////		if (DateUtil.isWeekend(new Date())) return;
////		balanceService.queryBalanceAndNotice(2);
////	}
//
//	/**
//	 * 将未开票的合并开票下的自然人身份证文件压缩
//	 * 每五小时执行一次
//	 */
//	//	@Scheduled(cron = "0 0 0/1 * * ?")
//	//	public void mergeInvoiceIdNoInfoCompress(){
//	//		if (!enabled) return;
//	//		List<ForeignInvoice> invoiceList = foreignInvoiceMapper.queryNoCompressedInvoice();
//	//		if(null != invoiceList && invoiceList.size() > 0){
//	//			LogUtil.info("===开始执行将未开票的合并开票下的自然人身份证文件压缩定时任务===");
//	//			invoiceList.forEach(invoice -> {
//	//				crowdsourceService.mergeInvoiceIdNoInfoCompress(invoice.getId());
//	//			});
//	//		} else {
//	//			LogUtil.info("未查询到满足条件的合并开票信息！");
//	//		}
//	//	}
//
//	/**
//	 * 共青城创客，已实名未上传视频的，每天推送一次微信通知，最多提醒3次
//	 */
//	@ZddTask(name = "共青城创客已实名未上传视频通知", desc = "共青城创客，已实名未上传视频的，每天推送一次微信通知，最多提醒3次", cronDesc = "每日上午10点30分执行")
//	@Scheduled(cron = "0 30 10 * * ?")
//	public void sendNoticeReminderToSubmitData() {
//		makerService.reminderToSubmitData();
//	}
//
//	/**
//	 * 催促企业上传 众包证据链
//	 * 发送给企业：
//	 * 您有x个共享经济众包项目尚未系统上传《完工验收&结算确认单》（或创客交付成果证据链）：yyyy-mm-dd hh:mm:ss-项目名称，yyyy-mm-dd hh:mm:ss-项目名称，yyyy-mm-dd
//	 * hh:mm:ss-项目名称，请及时上传。如有问题请咨询客服JUDY，或拨打全国客服电话17710090008。
//	 * 发送给商务经理：
//	 * 以下企业已完成共享经济众包项目交易但系统尚未上传《完工验收&结算确认单》（或创客交付成果证据链）：企业A有6个，企业B有2个，请及时跟进完成。
//	 * 发送给胡总：
//	 * 以下企业已完成共享经济众包项目交易但系统尚未上传《完工验收&结算确认单》（或创客交付成果证据链）：企业A有6笔，企业B有2笔。
//	 * （3次以后只发给商务和胡总）
//	 * 从2021年开始的项目
//	 */
//	@ZddTask(name = "催促企业上传众包证据链", desc = "催促企业上传众包证据链，给企业/胡刚/上午经理发送消息", cronDesc = "每日早上9点执行")
//	@Scheduled(cron = "0 0 9 * * ?")
//	public void urgeUploadProjectFile() {
//		companyService.urgeUploadProjectFile();
//	}
//
//	/**
//	 * 每天凌晨1点,统计企业智众包项目保证金
//	 */
//	@ZddTask(name = "统计当月企业智众包项目保证金", desc = "统计当月企业智众包项目保证金，如果是本月1日，则统计上月全月的保证金", cronDesc = "每日凌晨执行")
//	// @Scheduled(cron = "0 * * * * ?") //测试用
//	@Scheduled(cron = "0 0 1 * * ?")
//	public void recordCompanyCrowdsourceDeposit() {
//		crowdsourceDepositService.recordCompanyCrowdsourceDeposit();
//	}
//
//	/**
//	 * 每月1日1点,统计合伙人智众包成本佣金
//	 */
//	@ZddTask(name = "统计上月合伙人智众包成本佣金", desc = "统计上月合伙人智众包成本佣金", cronDesc = "每月1日凌晨1点执行")
//	// @Scheduled(cron = "0 * * * * ?") //测试用
//	@Scheduled(cron = "0 0 1 1 * ?")
//	public void recordPartnerCrowdsourceCost() {
//		partnerCrowdsourceCostService.recordPartnerCrowdsourceCost();
//	}
//
//	/**
//	 * 每周一上午十点执行
//	 * 注册后并审核通过但从没交易过的企业，发送提醒消息给商务经理；
//	 */
//	@ZddTask(name = "检查注册审核通过但未交易过的企业", desc = "注册后并审核通过但从没交易过的企业，发送提醒消息给商务经理", cronDesc = "每月1号上午10点执行")
//	@Scheduled(cron = "0 0 10 ? * MON")
//	public void noticeBusinessForNotTradedCompany() {
//		companyService.noticeBusinessForNotTradedCompany();
//	}
//
//	/**
//	 * 每月一号上午十点执行
//	 * 注册后并审核通过 但上一个月  项目 智众包项目 都没交易过的企业 发送提醒消息给商务经理；
//	 */
//	@ZddTask(name = "检查注册审核通过但上个月未交易过的企业", desc = "注册后并审核通过，但上一个月 项目、智众包项目都没交易过的企业 发送提醒消息给商务经理", cronDesc = "每月1号上午10点执行")
//	@Scheduled(cron = "0 0 10 1 * ?")
//	public void noticeBusinessForOneMonthNotTradedCompany() {
//		companyService.noticeBusinessForOneMonthNotTradedCompany();
//	}
//
//	/**
//	 * 将未开票的成本票-合并开票下的自然人身份证文件压缩
//	 * 每一小时执行一次
//	 */
//	@ZddTask(name = "将未开票的成本票-合并开票下的自然人身份证文件压缩", desc = "将未开票的成本票-合并开票下的自然人身份证文件压缩", cronDesc = "每一小时执行")
//	@Scheduled(cron = "0 0 0/1 * * ?")
//	public void mergeCostInvoiceIdNoInfoCompress() {
//		//查出 合并成本票后的发票数据 （状态为开票中，身份证附件信息为空）
//		List<CrowdsourceInvoice> invoiceList = crowdsourceProjectMapper.queryNoCompressedInvoice();
//		invoiceService.mergeCostInvoiceIdNoInfoCompress(invoiceList);
//	}
//
//	/**
//	 * 定时任务： 统计创客开户后的交易总额 周期统计。
//	 * 每天 凌晨2点 执行
//	 */
//	@ZddTask(name = "统计创客开户后周期内的交易总额", desc = "统计创客开户后周期内的交易总额", cronDesc = "每天凌晨9点执行")
//	@Scheduled(cron = "0 10 21 * * ?")
//	public void statisticsMakerAccountTotalTransaction() {
//		accountService.statisticsMakerAccountTotalTransaction();
//	}
//
//	/**
//	 * 定时任务： 将智众包项目发票的策略性开票转为开票中
//	 * 每月1号执行
//	 */
//	@ZddTask(name = "将当月的智众包项目发票的策略性开票转为开票中", desc = "将当月的智众包项目发票的策略性开票转为开票中", cronDesc = "每月1号执行")
//	@Scheduled(cron = "0 0 0 1 * ?")
//	public void processCrowdsourceInvoiceStrategy() {
//		invoiceService.processCrowdsourceInvoiceStrategy();
//	}
//
//	/**
//	 * 定时刷新所有已绑定了企业支付宝账号的创客的资金记账本信息
//	 */
//	@ZddTask(name = "定时刷新所有已绑定了企业支付宝账号的创客的资金记账本信息", desc = "定时刷新所有已绑定了企业支付宝账号的创客的资金记账本信息，只有生产环境才会执行", cronDesc = "每2分钟执行一次")
//	@Scheduled(cron = "0 0/2 * * * ?")
//	public void refreshMakerAlipayAccountBook() {
//		// 测试环境不刷新资金记账本信息
//		if (!ContextUtil.isProd()) return;
//		makerAliPayService.refreshMakerAlipayAccountBook();
//	}
//
//	/**
//	 * 定时刷新委托人给自己记账本充值的订单信息
//	 */
//	@ZddTask(name = "定时刷新委托人给自己记账本充值的订单信息", desc = "定时刷新委托人给自己记账本充值的订单信息", cronDesc = "每2分钟执行一次")
//	@Scheduled(cron = "0 0/2 * * * ?")
//	public void refreshAlipayPrincipalRecharge() {
//		makerAliPayService.refreshAlipayPrincipalRecharge();
//	}
//
//	/**
//	 * 定时刷新委托人转账给受托人创客记账本的订单信息
//	 */
//	@ZddTask(name = "定时刷新委托人转账给受托人创客记账本的订单信息", desc = "定时刷新委托人转账给受托人创客记账本的订单信息", cronDesc = "每2分钟执行一次")
//	@Scheduled(cron = "0 0/2 * * * ?")
//	public void refreshAlipayPrincipalTransfer() {
//		makerAliPayService.refreshAlipayPrincipalTransfer();
//	}
//
//	/**
//	 * 定时刷新受托人代付给自然人账户的订单信息
//	 */
//	@ZddTask(name = "定时刷新受托人代付给自然人账户的订单信息", desc = "定时刷新受托人代付给自然人账户的订单信息", cronDesc = "每2分钟执行一次")
//	@Scheduled(cron = "0 0/2 * * * ?")
//	public void refreshAlipayEntrusteePay() {
//		makerAliPayService.refreshAlipayEntrusteePay();
//	}
//
//	/**
//	 * 每天检查长期项目是否过期
//	 */
//	@ZddTask(name = "每天检查长期项目是否过期", desc = "每天检查长期项目是否过期，如果过期修改长期项目状态为已过期", cronDesc = "每日凌晨1点执行")
//	@Scheduled(cron = "0 1 1 * * ?")
//	public void checkLongTermProjectValid() {
//		coreLongTermProjectService.checkLongTermProjectValid();
//	}
//
//	/**
//	 * 每天检查委托函是否要到期通知商务
//	 */
//	@ZddTask(name = "检查委托函是否要到期通知商务", desc = "检查委托函是否要到期，到期前一个星期发企业微信通知商务，续签委托函", cronDesc = "每日早上9点执行")
//	@Scheduled(cron = "0 0 9 * * ?")
//	public void noticeBusiness() {
//		companyService.noticeBusiness();
//	}
//
//	@ZddTask(name = "刷新委托函到期状态", desc = "刷新委托函到期状态", cronDesc = "每日0点执行")
//	@Scheduled(cron = "1 0 0 * * ?")
//	public void refreshEntrustFileState() {
//		// 刷新企业委托函生效状态
//		companyEntrustFileMapper.refreshState();
//	}
//
//	/**
//	 * 智零工成本票逾期
//	 */
//	@ZddTask(name = "智零工成本票逾期通知cindy和胡刚", desc = "智零工成本票逾期7天通知", cronDesc = "每日早上10点执行")
//	@Scheduled(cron = "0 0 10 * * ?")
//	public void reminderOfOverdueCostTicket() {
//		invoiceService.reminderOfOverdueCostTicket();
//	}
//	@ZddTask(name = "税单逾期提醒", desc = "税单逾期提醒通知cindy 和 胡刚。", cronDesc = "每月25号每天15点")
//	@Scheduled(cron = "0 0 15 25 * ?")
//	public void overdueTaxForm() {
//		invoiceService.overdueTaxForm();
//	}
//
//	/**
//	 * 每周一上午10点15分执行任务检查委托函到期通知商务
//	 */
//	@ZddTask(name = "检查委托函到期通知商务", desc = "检查委托函已到期发企业微信通知商务，续签委托函", cronDesc = "每日早上9点10分执行")
//	@Scheduled(cron = "0 10 9 * * ?")
//	public void beExpired() {
//		companyService.expiredContracts();
//	}
//
////	 @ZddTask(name = "检查每日开 发票的企业委托函是否有效", desc = "检查每日开 发票的企业委托函是否有效，无效的发企业微信消息通知商务", cronDesc = "每日早上9点执行")
////	 @Scheduled(cron = "0 0 9 * * ?")
////	public void checkZddInvoiceCompanyEntrustFile() {
////		invoiceService.checkZddInvoiceCompanyEntrustFile();
////	}
//	@ZddTask(name = "代付委托函上传通知", desc = "定时任务检查没上传的企业合同", cronDesc = "每周一上午10点15分执行任务")
//	@Scheduled(cron = "0 15 10 ? * MON")
//	public void checkCompanyEntrustFile() {
//		companyService.theContractWasNotUploaded();
//	}
//
//	@ZddTask(name = "检查成本票创客发票逾期提醒", desc = "检查成本票创客发票逾期提醒，发统计数量消息通知商务", cronDesc = "每日早上9点执行")
//	@Scheduled(cron = "0 0 9 * * ?")
//	public void checkCrowdsourceCostInvoiceRemind() {
//		invoiceService.checkCrowdsourceCostInvoiceRemind();
//	}
//
//	@ZddTask(name = "检查智众包发票逾期提醒", desc = "检查智众包发票逾期提醒，发统计数量消息通知商务", cronDesc = "每月15号-25号每天16点")
//	@Scheduled(cron = "0 0 16 15,16,17,18,19,20,21,22,23,24,25 * ?")
//	public void checkCrowdsourceInvoiceRemind() {
//		invoiceService.checkCrowdsourceInvoiceRemind();
//	}
//
//	@ZddTask(name = "刷新招商银行交易管家记账子单元创建结果", desc = "刷新招商银行交易管家记账子单元创建结果", cronDesc = "每一小时刷新一次")
//	@Scheduled(cron = "0 0 0/1 * * ?")
//	public void refreshCreateSubLedgerStatus() {
//		zhaoShangTradeBulterService.refreshCreateSubLedgerStatus();
//	}
//
//	@ZddTask(name = "刷新招商银行交易管家记账子单元余额", desc = "刷新招商银行交易管家记账子单元余额", cronDesc = "每16,34,57分刷新一次")
//	@Scheduled(cron = "0 16,34,57 * * * ?")
//	public void refreshSubLedgerBalance() {
//		zhaoShangTradeBulterService.refreshSubLedgerBalance();
//	}
//
//	@ZddTask(name = "刷新招商银行交易管家记账子单元转账充值结果", desc = "刷新招商银行交易管家记账子单元转账充值结果", cronDesc = "每18,36,59分刷新一次")
//	@Scheduled(cron = "0 18,36,59 * * * ?")
//	public void refreshSubLedgerPay() {
//		zhaoShangTradeBulterService.refreshSubLedgerPay();
//	}
///*
//	@ZddTask(name = "刷新招商银行交易管家记账子单元充值汇入记录", desc = "刷新招商银行交易管家记账子单元充值汇入记录", cronDesc = "每隔5分钟刷新一次")
//	@Scheduled(cron = "0 0/5 * * * ?")
//	public void refreshSubLedgerIncomingRecords() {
//		zhaoShangTradeBulterService.refreshSubLedgerIncomingRecords();
//	}*/
//
//	@ZddTask(name = "刷新公开招标项目竞标结束", desc = "刷新公开招标项目，将项目状态修改为竞标结束", cronDesc = "每日凌晨至1点之间每5分钟刷新一次")
//	@Scheduled(cron = "0 0/5 0 * * ?")
//	public void refreshMakerBidProjectDate() {
//		projectService.refreshMakerBidProjectDate();
//	}
//
//	/**
//	 * 每天检查企业是否三个月没有进行任何项目交易
//	 */
//	@ZddTask(name = "检查企业近三个月未交易就冻结企业账户", desc = "检查企业近三个月是否有交易，超过3个月未交易的企业就系统自动冻结", cronDesc = "每日23点执行")
//	@Scheduled(cron = "0 0 23 * * ?")
//	public void checkCompany3MonthsNoTrade() {
//		companyService.checkCompany3MonthsNoTrade();
//	}
//
//	@ZddTask(name = "申请委托接单支付宝回单", desc = "根据委托接单每个子项目，向支付宝申请回单", cronDesc = "每隔5分钟刷新一次")
//	@Scheduled(cron = "0 0/5 * * * ?")
//	public void refreshApplyBillEreceipt() {
//		makerAliPayService.applyBillEreceipt();
//	}
//
//	@ZddTask(name = "获取委托接单支付宝回单下载链接", desc = "根据委托接单每个子项目，向支付宝获取回单下载url", cronDesc = "每隔5分钟刷新一次")
//	@Scheduled(cron = "0 0/5 * * * ?")
//	public void refreshRetrieveBillEreceiptUrl() {
//		makerAliPayService.retrieveBillEreceiptUrl();
//	}
//
//	@ZddTask(name = "查询招商银行交易是否退票", desc = "查询近两日招商银行交易成功的项目是否存在退票", cronDesc = "每日23点执行")
//	@Scheduled(cron = "0 0 23 * * ?")
//	public void queryZhaoShangPayTradeIsFail() {
//		crowdsourceProjectService.queryZhaoShangPayTradeIsFail();
//		projectService.queryZhaoShangPayTradeIsFail();
//	}
//
//	@ZddTask(name = "项目验收中发送通知", desc = "项目验收中发送通知", cronDesc = "每日早上10点执行")
//	@Scheduled(cron = "0 0 10 * * ?")
//	public void projectAcceptance() {
//		companyService.projectAcceptance();
//	}
//
//	@ZddTask(name = "创客生日祝福短信发送", desc = "创客生日祝福短信发送", cronDesc = "每日早上9点执行")
//	@Scheduled(cron = "0 0 9 * * ?")
//	public void sendMakerBirthSms() {
//		makerService.sendMakerBirthSms();
//	}
//
//	@ZddTask(name = "创客周年纪念短信发送", desc = "创客周年纪念短信发送", cronDesc = "每日早上9点执行")
//	@Scheduled(cron = "0 0 9 * * ?")
//	public void sendMakerAnniversarySms() {
//		makerService.sendMakerAnniversarySms();
//	}
//
//	@ZddTask(name = "每天晚上自动生成委托接单、智众包智零工的代发单项目验收单", desc = "每天晚上自动生成委托接单、智众包智零工的代发单项目验收单", cronDesc = "每日凌晨1点30执行")
//	@Scheduled(cron = "0 30 1 * * ?")
//	public void generalCroDeliveryProject() {
//		crowdsourceService.generalCroDeliveryProject();
//		entrustProjectService.generalEntrustDeliveryProject();
//	}
//
//
//	@ZddTask(name = "统计合同是否过期", desc = "统计合同是否过期", cronDesc = "每日凌晨1点执行")
//	@Scheduled(cron = "0 1 1 * * ?")
//	public void whetherTheContractHasExpired() {
//		companyService.whetherTheContractHasExpired();
//	}
}
